#pragma once

#include <iostream>
#include <string>
#include "./module/InetAddr.hpp"

class Reactor;
class Connection;
using handler_t = std::function<std::string(std::string&)>;

// 用来管理所有的连接--套接字--文件描述符
class Connection
{
public:
    Connection(){}
    ~Connection(){}
    // 定制一系列虚函数，让listener继承connection，使listensockfd和普通sockfd使用一套接口
    virtual void recver() = 0;
    virtual void sender() = 0;
    virtual void excepter() = 0;
    virtual int getSockfd() = 0;
    //virtual void register(handler_t hander) = 0;

    void setEvents(const uint32_t &events) { _events = events; }
    uint32_t getEvents() { return _events; }
    
    void setPrivateData(Reactor *owner) { _private_data = owner; }
    Reactor* getPrivateData() { return _private_data; }

    void registerHandler(handler_t handler) { _handler = handler; }

private:
    // 回指指针，指向tcpserver
    Reactor*_private_data;
    // 该文件描述符所关心得事件
    uint32_t _events;
public:
    // 回调方法，通过main函数设置给listensock然后再由listensock设置给普通套接字
    // 目的是为了对输入缓冲区中的输数据进行decode
    handler_t _handler;
};